// src/utils/werun.js
// 统一封装：fetchTodaySteps() -> 返回一个 Number（今日步数）
// 无服务器时，打开 USE_MOCK = true；接入后端时，改为 false 并配置 SERVER_URL

const USE_MOCK = true; // ←← 现在没有服务器，保持 true
const SERVER_URL = 'https://your.api/werun/steps'; // 真后端时改成你的地址

// ---------- 模拟模式：本地“今日步数”生成器 ----------
function todayStartTs() {
	const d = new Date();
	d.setHours(0, 0, 0, 0);
	return d.getTime();
}

// 一个简单可靠的“单调递增”模拟器：
// - 第一次当天调用：随机起点 2000~5000
// - 之后每次调用：根据距离上次调用的分钟数，增加 5~25 步/分钟（带点随机）
function mockTodaySteps() {
	const key = 'MOCK_WERUN_TODAY';
	const now = Date.now();
	const startOfDay = todayStartTs();

	let rec = uni.getStorageSync(key);
	if (!rec || !rec.day || rec.day !== startOfDay) {
		// 新的一天：初始化
		rec = {
			day: startOfDay,
			steps: Math.floor(2000 + Math.random() * 3000), // 2000~5000 起步
			ts: now
		};
	} else {
		// 根据时间推移增加步数（单调递增）
		const minutes = Math.max(1, Math.floor((now - rec.ts) / 60000));
		const incPerMin = 5 + Math.random() * 20; // 5~25 步/分钟
		rec.steps += Math.floor(minutes * incPerMin);
		rec.ts = now;
	}
	uni.setStorageSync(key, rec);
	return rec.steps;
}

// ---------- 真机 + 服务器解密模式 ----------
function ensureWeRunAuth() {
	return new Promise((resolve, reject) => {
		wx.getSetting({
			success: st => {
				if (st.authSetting['scope.werun']) return resolve(true);
				wx.authorize({
					scope: 'scope.werun',
					success: () => resolve(true),
					fail: () => reject(new Error('用户未授权微信运动'))
				});
			},
			fail: reject
		});
	});
}

async function fetchTodayStepsFromServer() {
	await ensureWeRunAuth();
	const {
		code
	} = await uni.login({
		provider: 'weixin'
	}).then(r => r[1] || r);
	const wr = await new Promise((resolve, reject) => {
		wx.getWeRunData({
			success: resolve,
			fail: reject
		});
	});
	const {
		encryptedData,
		iv
	} = wr;
	const resp = await uni.request({
		url: SERVER_URL,
		method: 'POST',
		header: {
			'content-type': 'application/json'
		},
		data: {
			code,
			encryptedData,
			iv
		}
	}).then(r => r[1] || r);
	if (!resp || resp.statusCode >= 400) throw new Error('服务端解密失败');
	const {
		todaySteps
	} = resp.data || {};
	if (typeof todaySteps !== 'number') throw new Error('todaySteps 非数字');
	return todaySteps;
}

// ---------- 对外导出统一函数 ----------
export async function fetchTodaySteps() {
	if (USE_MOCK) {
		return mockTodaySteps();
	} else {
		return fetchTodayStepsFromServer();
	}
}
